package com.cobra.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

//求相同key的平均值
object Spark26_RDD_Operator_Transform_combineByKey {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Spark26_RDD_Operator_Transform_combineByKey")
    val sc = new SparkContext(sparkConf)
   val rdd = sc.makeRDD(List(
     ("a",1),("a",2),("b",3),
     ("b",4),("b",5),("a",6)
   ),2)
    //combineByKey存在函数的柯里化，有两个参数列表
    //      第一个参数列表表示将相同key的第一个数据进行结构的转换，实现操作
    //      第二个参数表示分区内计算规则
    //      第三个参数表示分区间计算规则
    val newRDD : RDD[(String, (Int, Int))] = rdd.combineByKey(
      v => (v, 1),
      ( t:(Int, Int), v ) => {
        (t._1 + v, t._2 + 1)
      },
      (t1:(Int, Int), t2:(Int, Int)) => {
        (t1._1 + t2._1, t1._2 + t2._2)
      }
    )
    val resultRDD = newRDD.mapValues {
      case (num, count) => num / count
    }
    resultRDD.collect().foreach(println)
   // rdd.aggregateByKey(0)(_+_,_+_).collect().foreach(println)
    sc.stop()
  }
}
